home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************/
- /* */
- /* CRSRC */
- /* */
- /* Converts resource files to linkable C source code with functions to */
- /* emulate the AES resource functions. */
- /* */
- /* This is the source code for version 1.0 (first P.D. release). */
- /* */
- /* © Martin Packer 1990/91 */
- /* */
- /* Compiler: Lattice C version 5.06.02 */
- /* Compiler Options: -ctf */
- /* */
- /* You're welcome to make changes to this program if you want to (I wouldn't */
- /* have released the source code otherwise) but if you fix any bugs or make */
- /* any huge improvements I'd quite like to know about them. I'd also like to */
- /* know if you intend to distribute a modified version of the code. */
- /* I also reserve the right to be credited as the original author. */
- /******************************************************************************/
- #include <stdio.h>
- #include <stdlib.h>
- #include <gemlib.h>
- #include <fcntl.h>
- #include <string.h>
- #include <ctype.h>
-
- /* maximum number of resource files */
- #define MAX_RESOURCE_FILES 10
-
- /* maximum number of strings in a resource */
- #define MAX_STRINGS 10000
-
- /* array names */
- #define IMAGE_DATA_ARRAY "CrsrcImgData"
- #define TEDINFO_ARRAY "CrsrcTedinfo"
- #define ICONBLK_ARRAY "CrsrcIconblk"
- #define BITBLK_ARRAY "CrsrcBitblk"
- #define FREE_STRING_ARRAY "CrsrcFreeString"
- #define FREE_IMAGE_ARRAY "CrsrcFreeImage"
- #define OBJECT_ARRAY "CrsrcObject"
- #define TREE_ARRAY "CrsrcTree"
- char *Scope="static"; /* scope of the arrays in the destination file */
- char *Class=""; /* storage class of the arrays in the destination file */
-
- char *ResourceFile[MAX_RESOURCE_FILES]; /* array of resource file names */
- int NoResourceFiles; /* number of resource files */
- int CurResource; /* current resource file being processed */
- int NoObjects[MAX_RESOURCE_FILES]; /* array for storing number of objects in each resource file */
-
- char *DestFile=NULL; /* destination file name */
- FILE *DestHdl; /* destination file handle */
- char *RscBuf; /* resource file buffer pointer */
- RSHDR *RscHdr; /* resource file header pointer */
-
- long StringOffset[MAX_STRINGS]; /* array for sorted string offsets in resource */
-
- /******************************************************************************/
- /* Builds and sorts array of string offsets in resource. */
- /* We have to extract and sort all the string offsets */
- /* first so we can tell where they all start and end. */
- /******************************************************************************/
- void GetStrings(void)
- {
- int stringno=0; /* index for filling StringOffset[] */
- unsigned short *rscptr; /* pointer to the first of the file offsets in the resource header */
- unsigned short startoff;/* offset to the start of the string area */
- unsigned short endoff; /* offset to the end of the string area */
- long *freestr; /* pointer to free string pointer array */
- OBJECT *objptr; /* object pointer for extracting strings */
- TEDINFO *tedptr; /* tedinfo pointer for extracting strings */
- ICONBLK *iconptr; /* iconblk pointer for extracting string */
- int i;
-
-
- /* get pointer to start of string area in resource */
- startoff=RscHdr->rsh_string;
-
- /* get offset to end of string area by looking for the next offset */
- /* in the resource header */
- rscptr=&(RscHdr->rsh_object);
- endoff=RscHdr->rsh_rssize;
- for(i=0;i<9;i++) /* nine offsets in header */
- {
- if(rscptr[i]>startoff && rscptr[i]<endoff) endoff=rscptr[i];
- };
-
- /* this should be the end of the last string so store it in the array */
- StringOffset[stringno++]=endoff;
-
- /* extract free strings */
- freestr=(long *)(RscBuf+RscHdr->rsh_frstr);
- for(i=0; i<RscHdr->rsh_nstring && stringno<MAX_STRINGS; i++)
- {
- StringOffset[stringno++]=freestr[i];
- };
-
- /* extract strings from objects */
- objptr=(OBJECT *)(RscBuf+RscHdr->rsh_object);
- for(i=0; i<RscHdr->rsh_nobs && stringno<MAX_STRINGS; i++)
- {
- switch((objptr)->ob_type)
- {
- case G_BUTTON:
- case G_STRING:
- case G_TITLE:
- /* ob_spec is a pointer to the string */
- StringOffset[stringno++]=(long)objptr->ob_spec;
- break;
-
- case G_TEXT:
- case G_BOXTEXT:
- case G_FTEXT:
- case G_FBOXTEXT:
- /* ob_spec is a pointer to a TEDINFO containing strings */
- tedptr=(TEDINFO *)(RscBuf+(long)objptr->ob_spec);
- StringOffset[stringno++]=(long)tedptr->te_ptext;
- StringOffset[stringno++]=(long)tedptr->te_ptmplt;
- StringOffset[stringno++]=(long)tedptr->te_pvalid;
- break;
-
- case G_ICON:
- /* ob_spec is a pointer to an ICONBLK containing a string */
- iconptr=(ICONBLK *)(RscBuf+(long)objptr->ob_spec);
- StringOffset[stringno++]=(long)iconptr->ib_ptext;
- break;
- };
- objptr++;
- };
-
- if(stringno==MAX_STRINGS)
- {
- printf("Too many strings in resource file: %s\n", ResourceFile[CurResource]);
- };
-
- /* sort the array */
- lqsort(StringOffset,stringno);
- }
-
- /******************************************************************************/
- /* Looks up the given string offset in StringOffset[] and returns index */
- /******************************************************************************/
- int LookUpString(long stringoff) /* string offset to look up */
- {
- int i;
-
- for(i=0;stringoff>StringOffset[i] && StringOffset[i];i++);
-
- return(i);
- }
-
- /******************************************************************************/
- /* Writes the given string from StringOffset[] */
- /******************************************************************************/
- void WriteString(int index) /* index in StringOffset[] */
- {
- char *startptr; /* start of string */
- char *endptr; /* end of string */
- char *tp;
- char ch;
-
- startptr=RscBuf+StringOffset[index];
- endptr=RscBuf+StringOffset[index+1]-1;
-
- fputc('\"',DestHdl);
-
- for(tp=startptr;tp<endptr;tp++)
- {
- ch=*tp;
-
- switch(ch)
- {
- /* lexicals */
- case '\"':
- fputs("\\\"",DestHdl);
- break;
-
- case '\'':
- fputs("\\\'",DestHdl);
- break;
-
- case '\\':
- fputs("\\\\",DestHdl);
- break;
-
- case '\n':
- fputs("\\n",DestHdl);
- break;
-
- case '\r':
- fputs("\\r",DestHdl);
- break;
-
- case '\0':
- fputs("\\0",DestHdl);
- break;
-
- default:
- if(isprint(ch))
- {
- /* printables */
- fputc(ch,DestHdl);
- }
- else
- {
- /* unprintables */
- fprintf(DestHdl,"\\X%0.2X\"\"",ch);
- };
- };
- };
-
- fputc('\"',DestHdl);
- }
-
- /******************************************************************************/
- /* Checks for free images and objects that use image data and returns */
- /* non-0 if there are any. This is the only way to check if there is */
- /* image data in the resource. */
- /******************************************************************************/
- int CheckForImages(void)
- {
- OBJECT *objptr; /* object pointer */
- unsigned short objtype; /* object type */
- int i;
-
- if(RscHdr->rsh_nimages) return(1);
-
- objptr=(OBJECT *)(RscBuf+RscHdr->rsh_object);
- for(i=0; i<RscHdr->rsh_nobs; i++)
- {
- objtype=(objptr++)->ob_type;
- if(objtype==G_IMAGE || objtype==G_ICON) return(1);
- };
-
- return(0);
- }
-
- /******************************************************************************/
- /* Write image data from resource */
- /******************************************************************************/
- void WriteImageData(void)
- {
- unsigned short *rscptr; /* pointer to the first of the file offsets in the resource header */
- unsigned short *startptr; /* pointer to the start of the image data */
- unsigned short *endptr; /* pointer to the end of the image data */
- unsigned short *imageptr; /* image data pointer */
- int i;
-
- fprintf(DestHdl,"%s short %s %s%d[]=\n{", Scope, Class, IMAGE_DATA_ARRAY, CurResource);
-
- if(!CheckForImages())
- {
- fprintf(DestHdl,"\n 0 /* no image data */\n};\n\n");
- return;
- };
-
- startptr=(unsigned short *)(RscBuf+RscHdr->rsh_imdata);
-
- /* find end pointer by looking for the next pointer in the resource header */
- rscptr=&(RscHdr->rsh_object);
- endptr=(unsigned short *)(RscBuf+RscHdr->rsh_rssize);
- for(i=0;i<9;i++) /* nine offsets in header */
- {
- if(RscBuf+rscptr[i]>(char *)startptr && RscBuf+rscptr[i]<(char *)endptr) endptr=(unsigned short *)(RscBuf+rscptr[i]);
- };
-
- imageptr=startptr;
-
- while(imageptr < endptr)
- {
- /* eight words per line */
- if((imageptr-startptr)%8==0)
- {
- fprintf(DestHdl,"\n/*%4d*/",(imageptr-startptr));
- };
-
- fprintf(DestHdl,"0X%0.4X",*(imageptr++));
-
- /* print a comma if we're not finished */
- if(imageptr < endptr) fprintf(DestHdl,", ");
- };
- fprintf(DestHdl,"\n};\n\n");
- }
-
- /******************************************************************************/
- /* Write TEDINFOs from resource */
- /******************************************************************************/
- void WriteTedinfos(void)
- {
- TEDINFO *tedarray; /* TEDINFO array pointer */
- int i;
-
- fprintf(DestHdl,"%s TEDINFO %s %s%d[]=\n{\n", Scope, Class, TEDINFO_ARRAY, CurResource);
-
- if(RscHdr->rsh_nted==0)
- {
- fprintf(DestHdl," NULL /* no TEDINFO's */\n};\n\n");
- return;
- };
-
- tedarray=(TEDINFO *)(RscBuf+RscHdr->rsh_tedinfo);
- for(i=0; i<RscHdr->rsh_nted; i++)
- {
- fprintf(DestHdl,"/*%4d*/",i);
-
- /* write text string */
- WriteString(LookUpString((long)tedarray[i].te_ptext));
- fprintf(DestHdl,",\n ");
-
- /* write template string */
- WriteString(LookUpString((long)tedarray[i].te_ptmplt));
- fprintf(DestHdl,",\n ");
-
- /* write validation string */
- WriteString(LookUpString((long)tedarray[i].te_pvalid));
- fprintf(DestHdl,",\n ");
-
- /* write the other stuff */
- fprintf(DestHdl,"%2d, %2d, %2d, 0X%0.4X, %2d, %2d, %2d, %2d",
- tedarray[i].te_font, tedarray[i].te_junk1, tedarray[i].te_just,
- tedarray[i].te_color, tedarray[i].te_junk2, tedarray[i].te_thickness,
- tedarray[i].te_txtlen, tedarray[i].te_tmplen);
-
- if(i<RscHdr->rsh_nted-1) fprintf(DestHdl,",\n");
- else fprintf(DestHdl,"\n");
- };
-
- fprintf(DestHdl,"};\n\n");
- }
-
- /******************************************************************************/
- /* Write ICONBLKs from resource */
- /******************************************************************************/
- void WriteIconblks(void)
- {
- ICONBLK *iconarray; /* ICONBLK array pointer */
- int i;
-
- fprintf(DestHdl,"%s ICONBLK %s %s%d[]=\n{\n", Scope, Class, ICONBLK_ARRAY, CurResource);
-
- if(RscHdr->rsh_nib==0)
- {
- fprintf(DestHdl," NULL /* no ICONBLK's */\n};\n\n");
- return;
- };
-
- iconarray=(ICONBLK *)(RscBuf+RscHdr->rsh_iconblk);
- for(i=0; i<RscHdr->rsh_nib; i++)
- {
- fprintf(DestHdl,"/*%4d*/",i);
-
- /* write icon mask & data pointers */
- fprintf(DestHdl,"&%s%d[%3ld], ",IMAGE_DATA_ARRAY, CurResource,
- ((long)iconarray[i].ib_pmask-RscHdr->rsh_imdata)/sizeof(short));
- fprintf(DestHdl,"&%s%d[%3ld], ",IMAGE_DATA_ARRAY, CurResource,
- ((long)iconarray[i].ib_pdata-RscHdr->rsh_imdata)/sizeof(short));
-
- /* write icon string */
- WriteString(LookUpString((long)iconarray[i].ib_ptext));
- fprintf(DestHdl,",\n ");
-
- /* write the other stuff */
- fprintf(DestHdl,"0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X",
- iconarray[i].ib_char, iconarray[i].ib_xchar, iconarray[i].ib_ychar,
- iconarray[i].ib_xicon, iconarray[i].ib_yicon, iconarray[i].ib_wicon,
- iconarray[i].ib_hicon, iconarray[i].ib_xtext, iconarray[i].ib_ytext,
- iconarray[i].ib_wtext, iconarray[i].ib_htext);
-
- if(i<RscHdr->rsh_nib-1) fprintf(DestHdl,",\n");
- else fprintf(DestHdl,"\n");
- };
-
- fprintf(DestHdl,"};\n\n");
- }
-
- /******************************************************************************/
- /* Write BITBLKs from resource */
- /******************************************************************************/
- void WriteBitblks(void)
- {
- BITBLK *bitarray; /* BITBLK array pointer */
- int i;
-
- fprintf(DestHdl,"%s BITBLK %s %s%d[]=\n{\n", Scope, Class, BITBLK_ARRAY, CurResource);
-
- if(RscHdr->rsh_nbb==0)
- {
- fprintf(DestHdl," NULL /* no BITBLK's */\n};\n\n");
- return;
- };
-
- bitarray=(BITBLK *)(RscBuf+RscHdr->rsh_bitblk);
- for(i=0; i<RscHdr->rsh_nbb; i++)
- {
- if(i%10==0) fprintf(DestHdl,"/*%4d*/",i);
- else fprintf(DestHdl," ");
-
- /* write bit data pointer */
- fprintf(DestHdl,"&%s%d[%3ld], ", IMAGE_DATA_ARRAY, CurResource,
- ((long)bitarray[i].bi_pdata-RscHdr->rsh_imdata)/sizeof(short));
-
- /* write the other stuff */
- fprintf(DestHdl,"0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X",
- bitarray[i].bi_wb, bitarray[i].bi_hl, bitarray[i].bi_x,
- bitarray[i].bi_y, bitarray[i].bi_color);
-
- if(i<RscHdr->rsh_nbb-1) fprintf(DestHdl,",\n");
- else fprintf(DestHdl,"\n");
- };
-
- fprintf(DestHdl,"};\n\n");
- }
-
- /******************************************************************************/
- /* Write free strings from resource */
- /******************************************************************************/
- void WriteFreeStrings(void)
- {
- long *freestring; /* free string array pointer */
- int i;
-
- fprintf(DestHdl,"%s char %s *%s%d[]=\n{\n", Scope, Class, FREE_STRING_ARRAY, CurResource);
-
- if(RscHdr->rsh_nstring==0)
- {
- fprintf(DestHdl," NULL /* no free strings */\n};\n\n");
- return;
- };
-
- freestring=(long *)(RscBuf+RscHdr->rsh_frstr);
- for(i=0;i<RscHdr->rsh_nstring;i++)
- {
- if(i%10==0) fprintf(DestHdl,"/*%4d*/",i);
- else fprintf(DestHdl," ");
-
- /* write string by looking in offsets array */
- WriteString(LookUpString(freestring[i]));
-
- if(i<RscHdr->rsh_nstring-1) fprintf(DestHdl,",\n");
- else fprintf(DestHdl,"\n");
- };
-
- fprintf(DestHdl,"};\n\n");
- }
-
- /******************************************************************************/
- /* Write free images from resource */
- /******************************************************************************/
- void WriteFreeImages(void)
- {
- long *freeimage; /* free image array pointer */
- int i;
-
- fprintf(DestHdl,"%s BITBLK %s *%s%d[]=\n{\n", Scope, Class, FREE_IMAGE_ARRAY, CurResource);
-
- if(RscHdr->rsh_nimages==0)
- {
- fprintf(DestHdl," NULL /* no free images */\n};\n\n");
- return;
- };
-
- freeimage=(long *)(RscBuf+RscHdr->rsh_frimg);
- for(i=0;i<RscHdr->rsh_nimages;i++)
- {
- if(i%10==0) fprintf(DestHdl,"/*%4d*/",i);
- else fprintf(DestHdl," ");
-
- /* write pointer into BITBLK array */
- fprintf(DestHdl,"&%s%d[%3ld], ", BITBLK_ARRAY, CurResource,
- (freeimage[i]-RscHdr->rsh_bitblk)/sizeof(BITBLK));
-
- if(i<RscHdr->rsh_nimages-1) fprintf(DestHdl,",\n");
- else fprintf(DestHdl,"\n");
- };
-
- fprintf(DestHdl,"};\n\n");
- }
-
- /******************************************************************************/
- /* Write OBJECTs from resource */
- /******************************************************************************/
- void WriteObjects(void)
- {
- OBJECT *objarray; /* OBJECT array pointer */
- int i;
-
- fprintf(DestHdl,"%s OBJECT %s %s%d[]=\n{\n", Scope, Class, OBJECT_ARRAY, CurResource);
-
- if(RscHdr->rsh_nobs==0)
- {
- fprintf(DestHdl," NULL /* no OBJECT's */\n};\n\n");
- return;
- };
-
- objarray=(OBJECT *)(RscBuf+RscHdr->rsh_object);
- for(i=0; i<RscHdr->rsh_nobs; i++)
- {
- if(i%10==0) fprintf(DestHdl,"/*%4d*/",i);
- else fprintf(DestHdl," ");
-
- /* write related object indexes */
- fprintf(DestHdl,"%3d, %3d, %3d, ",
- objarray[i].ob_next, objarray[i].ob_head, objarray[i].ob_tail);
-
- /* write object type (use type name, it makes things much clearer) */
- switch(objarray[i].ob_type)
- {
- case G_BOX:
- fprintf(DestHdl,"G_BOX ,");
- break;
-
- case G_TEXT:
- fprintf(DestHdl,"G_TEXT ,");
- break;
-
- case G_BOXTEXT:
- fprintf(DestHdl,"G_BOXTEXT ,");
- break;
-
- case G_IMAGE:
- fprintf(DestHdl,"G_IMAGE ,");
- break;
-
- case G_PROGDEF:
- fprintf(DestHdl,"G_PROGDEF ,");
- break;
-
- case G_IBOX:
- fprintf(DestHdl,"G_IBOX ,");
- break;
-
- case G_BUTTON:
- fprintf(DestHdl,"G_BUTTON ,");
- break;
-
- case G_BOXCHAR:
- fprintf(DestHdl,"G_BOXCHAR ,");
- break;
-
- case G_STRING:
- fprintf(DestHdl,"G_STRING ,");
- break;
-
- case G_FTEXT:
- fprintf(DestHdl,"G_FTEXT ,");
- break;
-
- case G_FBOXTEXT:
- fprintf(DestHdl,"G_FBOXTEXT,");
- break;
-
- case G_ICON:
- fprintf(DestHdl,"G_ICON ,");
- break;
-
- case G_TITLE:
- fprintf(DestHdl,"G_TITLE ,");
- break;
- };
-
- /* write object state & flags */
- fprintf(DestHdl,"0X%0.4X, 0x%0.4X, ",
- objarray[i].ob_flags, objarray[i].ob_state);
-
- /* write object spec. (dependent on object type) */
- switch(objarray[i].ob_type)
- {
- case G_BOX:
- case G_IBOX:
- case G_BOXCHAR:
- /* bit flags etc. */
- fprintf(DestHdl,"(void *)0X%0.8X, ",objarray[i].ob_spec);
- break;
-
- case G_TEXT:
- case G_BOXTEXT:
- case G_FTEXT:
- case G_FBOXTEXT:
- /* TEDINFO pointer */
- fprintf(DestHdl,"&%s%d[%3d], ", TEDINFO_ARRAY, CurResource,
- ((long)objarray[i].ob_spec-RscHdr->rsh_tedinfo)/sizeof(TEDINFO));
- break;
-
- case G_IMAGE:
- /* BITBLK pointer */
- fprintf(DestHdl,"&%s%d[%3d], ", BITBLK_ARRAY, CurResource,
- ((long)objarray[i].ob_spec-RscHdr->rsh_bitblk)/sizeof(BITBLK));
- break;
-
- case G_PROGDEF:
- /* APPLBLK pointer should be initialised be application */
- fputs("NULL, ",DestHdl);
- break;
-
- case G_BUTTON:
- case G_STRING:
- case G_TITLE:
- /* string */
- WriteString(LookUpString((long)objarray[i].ob_spec));
- fputs(", ",DestHdl);
- break;
-
- case G_ICON:
- /* ICONBLK pointer */
- fprintf(DestHdl,"&%s%d[%3d], ", ICONBLK_ARRAY, CurResource,
- ((long)objarray[i].ob_spec-RscHdr->rsh_iconblk)/sizeof(ICONBLK));
- break;
- };
-
- /* write object x, y, width & height */
- fprintf(DestHdl,"0X%0.4X, 0X%0.4X, 0X%0.4X, 0X%0.4X",
- objarray[i].ob_x, objarray[i].ob_y,
- objarray[i].ob_width, objarray[i].ob_height);
-
- if(i<RscHdr->rsh_nobs-1) fprintf(DestHdl,",\n");
- else fprintf(DestHdl,"\n");
- };
-
- fprintf(DestHdl,"};\n\n");
- }
-
- /******************************************************************************/
- /* Write trees from resource */
- /******************************************************************************/
- void WriteTrees(void)
- {
- long *treearray; /* tree array pointer */
- int i;
-
- fprintf(DestHdl,"%s OBJECT %s *%s%d[]=\n{\n", Scope, Class, TREE_ARRAY, CurResource);
-
- if(RscHdr->rsh_ntree==0)
- {
- fprintf(DestHdl," NULL /* no trees */\n};\n\n");
- return;
- };
-
- treearray=(long *)(RscBuf+RscHdr->rsh_trindex);
- for(i=0;i<RscHdr->rsh_ntree;i++)
- {
- fprintf(DestHdl,"/*%4d*/",i);
-
- /* write pointer into OBJECT array */
- fprintf(DestHdl,"&%s%d[%3ld]",OBJECT_ARRAY, CurResource,
- (treearray[i]-RscHdr->rsh_object)/sizeof(OBJECT));
-
- if(i<RscHdr->rsh_ntree-1) fprintf(DestHdl,",\n");
- else fprintf(DestHdl,"\n");
- };
-
- fprintf(DestHdl,"};\n\n");
- }
-
-
- /******************************************************************************/
- /* Write header code */
- /******************************************************************************/
- void WriteHeader(void)
- {
- int i;
-
- fprintf(DestHdl,"/******************************************************************************/\n");
- fprintf(DestHdl,"/* CRSRC extracted resource data from: */\n");
- for(i=0; i<NoResourceFiles; i++)
- {
- fprintf(DestHdl,"/* %-64s */\n",ResourceFile[i]);
- };
- fprintf(DestHdl,"/******************************************************************************/\n");
-
- fprintf(DestHdl,"#include <stdio.h>\n");
- fprintf(DestHdl,"#include <gemlib.h>\n");
- fprintf(DestHdl,"#include <string.h>\n\n");
- fprintf(DestHdl,"#define NO_RESOURCE_FILES %d\n\n", NoResourceFiles);
- fprintf(DestHdl,"%s int CrsrcFlag=0;\n\n", Scope);
- fprintf(DestHdl,"%s short *%s;\n", Scope, IMAGE_DATA_ARRAY);
- fprintf(DestHdl,"%s TEDINFO *%s;\n", Scope, TEDINFO_ARRAY);
- fprintf(DestHdl,"%s ICONBLK *%s;\n", Scope, ICONBLK_ARRAY);
- fprintf(DestHdl,"%s BITBLK *%s;\n", Scope, BITBLK_ARRAY);
- fprintf(DestHdl,"%s char **%s;\n", Scope, FREE_STRING_ARRAY);
- fprintf(DestHdl,"%s BITBLK **%s;\n", Scope, FREE_IMAGE_ARRAY);
- fprintf(DestHdl,"%s OBJECT *%s;\n", Scope, OBJECT_ARRAY);
- fprintf(DestHdl,"%s OBJECT **%s;\n\n", Scope, TREE_ARRAY);
- }
-
- /******************************************************************************/
- /* Write AES emulation functions */
- /******************************************************************************/
- void WriteFunctions(void)
- {
- int i;
-
- fprintf(DestHdl, "void CrsrcEnable(void)\n");
- fprintf(DestHdl, "{\n");
- fprintf(DestHdl, " CrsrcFlag=1;\n");
- fprintf(DestHdl, "}\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, "int Crsrc_load(char *filename)\n");
- fprintf(DestHdl, "{\n");
- fprintf(DestHdl, " int i,j;\n");
- fprintf(DestHdl, " static struct\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " char *FileName;\n");
- fprintf(DestHdl, " int NoObjects;\n");
- fprintf(DestHdl, " short *%s;\n", IMAGE_DATA_ARRAY);
- fprintf(DestHdl, " TEDINFO *%s;\n", TEDINFO_ARRAY);
- fprintf(DestHdl, " ICONBLK *%s;\n", ICONBLK_ARRAY);
- fprintf(DestHdl, " BITBLK *%s;\n", BITBLK_ARRAY);
- fprintf(DestHdl, " char **%s;\n", FREE_STRING_ARRAY);
- fprintf(DestHdl, " BITBLK **%s;\n", FREE_IMAGE_ARRAY);
- fprintf(DestHdl, " OBJECT *%s;\n", OBJECT_ARRAY);
- fprintf(DestHdl, " OBJECT **%s;\n", TREE_ARRAY);
- fprintf(DestHdl, " }\n");
- fprintf(DestHdl, " resource[]=\n");
- fprintf(DestHdl, " {\n");
- for(i=0; i<NoResourceFiles; i++)
- {
- fprintf(DestHdl, " \"%s\", %d, %s%d, %s%d, %s%d, %s%d, %s%d, %s%d, %s%d, %s%d",
- ResourceFile[i], NoObjects[i], IMAGE_DATA_ARRAY, i,
- TEDINFO_ARRAY, i, ICONBLK_ARRAY, i, BITBLK_ARRAY, i,
- FREE_STRING_ARRAY, i, FREE_IMAGE_ARRAY, i,
- OBJECT_ARRAY, i, TREE_ARRAY, i);
- if(i<NoResourceFiles-1) fprintf(DestHdl,",\n");
- else fprintf(DestHdl,"\n");
- };
- fprintf(DestHdl, " };\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, " if(CrsrcFlag)\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " for(i=0; strcmpi(filename, resource[i].FileName) && i<NO_RESOURCE_FILES; i++)\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " };\n");
- fprintf(DestHdl, " if(i==NO_RESOURCE_FILES)\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " return(0);\n");
- fprintf(DestHdl, " };\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, " %s=resource[i].%s;\n", IMAGE_DATA_ARRAY, IMAGE_DATA_ARRAY);
- fprintf(DestHdl, " %s=resource[i].%s;\n", TEDINFO_ARRAY, TEDINFO_ARRAY);
- fprintf(DestHdl, " %s=resource[i].%s;\n", ICONBLK_ARRAY, ICONBLK_ARRAY);
- fprintf(DestHdl, " %s=resource[i].%s;\n", BITBLK_ARRAY, BITBLK_ARRAY);
- fprintf(DestHdl, " %s=resource[i].%s;\n", FREE_STRING_ARRAY, FREE_STRING_ARRAY);
- fprintf(DestHdl, " %s=resource[i].%s;\n", FREE_IMAGE_ARRAY, FREE_IMAGE_ARRAY);
- fprintf(DestHdl, " %s=resource[i].%s;\n", OBJECT_ARRAY, OBJECT_ARRAY);
- fprintf(DestHdl, " %s=resource[i].%s;\n", TREE_ARRAY, TREE_ARRAY);
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, " for(j=0; j<resource[i].NoObjects; j++)\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " rsrc_obfix(%s, j);\n", OBJECT_ARRAY);
- fprintf(DestHdl, " };\n");
- fprintf(DestHdl, " return(1);\n");
- fprintf(DestHdl, " }\n");
- fprintf(DestHdl, " else\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " return(rsrc_load(filename));\n");
- fprintf(DestHdl, " }\n");
- fprintf(DestHdl, "}\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, "int Crsrc_free(void)\n");
- fprintf(DestHdl, "{\n");
- fprintf(DestHdl, " if(CrsrcFlag)\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " return(1);\n");
- fprintf(DestHdl, " }\n");
- fprintf(DestHdl, " else\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " return(rsrc_free());\n");
- fprintf(DestHdl, " };\n");
- fprintf(DestHdl, "}\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, "int Crsrc_obfix(OBJECT *tree, int index)\n");
- fprintf(DestHdl, "{\n");
- fprintf(DestHdl, " return(rsrc_obfix(tree, index));\n");
- fprintf(DestHdl, "}\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, "int Crsrc_gaddr(int type, int index, void *addr)\n");
- fprintf(DestHdl, "{\n");
- fprintf(DestHdl, " if(CrsrcFlag)\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " switch(type)\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " case R_TREE:\n");
- fprintf(DestHdl, " *((OBJECT **)addr)=%s[index];\n",TREE_ARRAY);
- fprintf(DestHdl, " break;\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, " case R_OBJECT:\n");
- fprintf(DestHdl, " *((OBJECT **)addr)=&%s[index];\n",OBJECT_ARRAY);
- fprintf(DestHdl, " break;\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, " case R_STRING:\n");
- fprintf(DestHdl, " *((char **)addr)=%s[index];\n",FREE_STRING_ARRAY);
- fprintf(DestHdl, " break;\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, " case R_IMAGEDATA:\n");
- fprintf(DestHdl, " *((BITBLK **)addr)=%s[index];\n",FREE_IMAGE_ARRAY);
- fprintf(DestHdl, " break;\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, " case R_FRSTR:\n");
- fprintf(DestHdl, " *((char ***)addr)=%s;\n",FREE_STRING_ARRAY);
- fprintf(DestHdl, " break;\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, " case R_FRIMG:\n");
- fprintf(DestHdl, " *((BITBLK ***)addr)=%s;\n",FREE_IMAGE_ARRAY);
- fprintf(DestHdl, " break;\n");
- fprintf(DestHdl, " };\n");
- fprintf(DestHdl, " return(1);\n");
- fprintf(DestHdl, " }\n");
- fprintf(DestHdl, " else\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " return(rsrc_gaddr(type, index, addr));\n");
- fprintf(DestHdl, " };\n");
- fprintf(DestHdl, "}\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, "int Crsrc_saddr(int type, int index, void *addr)\n");
- fprintf(DestHdl, "{\n");
- fprintf(DestHdl, " if(CrsrcFlag)\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " switch(type)\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " case R_STRING:\n");
- fprintf(DestHdl, " %s[index]=addr;\n",FREE_STRING_ARRAY);
- fprintf(DestHdl, " break;\n");
- fprintf(DestHdl, "\n");
- fprintf(DestHdl, " case R_IMAGEDATA:\n");
- fprintf(DestHdl, " %s[index]=addr;\n",FREE_IMAGE_ARRAY);
- fprintf(DestHdl, " break;\n");
- fprintf(DestHdl, " };\n");
- fprintf(DestHdl, " return(1);\n");
- fprintf(DestHdl, " }\n");
- fprintf(DestHdl, " else\n");
- fprintf(DestHdl, " {\n");
- fprintf(DestHdl, " return(rsrc_saddr(type, index, addr));\n");
- fprintf(DestHdl, " };\n");
- fprintf(DestHdl, "}\n");
- }
-
- /******************************************************************************/
- /* Loads a resource file into a malloc()'d buffer. */
- /* Returns a pointer to the buffer or NULL if error. */
- /******************************************************************************/
- char *LoadResource(char *filename)
- {
- int fh; /* file handle */
- long flen; /* file length */
- char *buffer; /* buffer pointer to return */
-
- if((fh=open(filename,O_RDONLY | O_RAW))==-1)
- {
- return(NULL);
- };
-
- if((flen=filelength(fh))==-1)
- {
- close(fh);
- return(NULL);
- };
-
- if((buffer=malloc(flen+1))==NULL)
- {
- close(fh);
- return(NULL);
- };
-
- if(read(fh,buffer,flen)!=flen)
- {
- close(fh);
- free(buffer);
- return(NULL);
- };
-
- close(fh);
-
- return(buffer);
- }
-
- /******************************************************************************/
- /* Get command line parameters - sets various flags and fills ResourceFile[] */
- /******************************************************************************/
- void GetPar(int argc, char **argv)
- {
- int i;
-
- NoResourceFiles=0;
- for(i=1;i<argc;i++)
- {
- if(argv[i][0]=='-' || argv[1][0]=='/')
- {
- switch(toupper(argv[i][1]))
- {
- case 'O': /* send output to file */
- DestFile=&argv[i][2];
- break;
-
- case 'P': /* send output to printer */
- DestHdl=stdprt;
- break;
-
- case 'E': /* make arrays external */
- Scope="";
- break;
-
- case 'C': /* set array storage class */
- Class=&argv[i][2];
- break;
- };
- }
- else
- {
- ResourceFile[NoResourceFiles++]=argv[i];
- };
- };
- }
-
- /******************************************************************************/
- /* MAIN */
- /******************************************************************************/
- void main(int argc, char **argv)
- {
- if(argc<2)
- {
- printf("CRSRC Version 1.0 © Martin Packer 1991\n");
- printf("Converts one or more GEM resource files to a linkable C source code module\n");
- printf("with functions to emulate the AES resource functions.\n");
- printf("USAGE: CRSRC <rsc file 1> [rsc file 2...] [-p|-o<filename>] [-e] [-c<class>]\n");
- printf(" -o<filename> sends ouput to file\n");
- printf(" -p sends output to printer\n");
- printf(" -e gives the resource arrays external linkage (default static)\n");
- printf(" -c<class> sets the storage class of the resource arrays\n");
- printf("If -o or -p not used, code is sent to standard output.\n");
- printf("Press a key...\n");
- exit(EXIT_FAILURE);
- };
-
- /* read command line parameters */
- GetPar(argc,argv);
-
- /* if no destination file given send it to stdout */
- if(DestFile==NULL)
- {
- DestHdl=stdout;
- }
- else if((DestHdl=fopen(DestFile,"w"))==NULL)
- {
- printf("Can't open output file %s\n",DestFile);
- exit(EXIT_FAILURE);
- };
-
- WriteHeader(); /* write header code */
-
- for(CurResource=0; CurResource<NoResourceFiles; CurResource++)
- {
- if(RscBuf=LoadResource(ResourceFile[CurResource]))
- {
- RscHdr=(RSHDR *)RscBuf;
- NoObjects[CurResource]=RscHdr->rsh_nobs;
- GetStrings(); /* extract string offsets from resource */
-
- fprintf(DestHdl,"/******** Data from %s ********/\n\n", ResourceFile[CurResource]);
-
- WriteImageData();
- WriteTedinfos();
- WriteIconblks();
- WriteBitblks();
- WriteFreeStrings();
- WriteFreeImages();
- WriteObjects();
- WriteTrees();
-
- fprintf(DestHdl,"\n\n\n");
-
- free(RscBuf);
- }
- else
- {
- printf("Error loading Resource file %s\n", ResourceFile[CurResource]);
- };
-
- };
-
- fprintf(DestHdl,"/******** AES emulation functions ********/\n\n");
-
- WriteFunctions();
-
- fclose(DestHdl);
-
- exit(EXIT_SUCCESS);
- }
-